package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;

@Entity
@Table(name = "SIL_PEDIDOS_OT")
@NamedQueries({
   @NamedQuery(
           name = "Pedido.maxPorSerie",
           query = "SELECT MAX(p.llave.numero) FROM Pedido p WHERE p.llave.serie = :serie"
   )
})
public class Pedido implements Serializable {

   private static final long serialVersionUID = 1L;
   protected PedidoPK llave;
   private Date fecha;
   private double descuento;
   private double retencionIva;
   private String comentarios;
   private String estatus;
   private String usuarioCreo;
   private String usuarioModif;
   private Proveedor proveedor;
   private List<PedidoOrden> ordenes;
   private List<Factura> facturas;
   private List<MultipartFile> anexosFactura;
   private Solicitud solicitud;

   public Pedido() {
   }

   public Pedido(PedidoPK llave) {
      this.llave = llave;
   }

   public Pedido(String serie, int numero) {
      this.llave = new PedidoPK(serie, numero);
   }

   public Pedido(PedidoPK llave, Date fecha, double descuento, double retencionIva,
           String estatus) {
      this.llave = llave;
      this.fecha = fecha;
      this.descuento = descuento;
      this.retencionIva = retencionIva;
      this.estatus = estatus;
   }

   @Transient
   public List<MultipartFile> getAnexosFactura() {
      return anexosFactura;
   }

   public void setAnexosFactura(List<MultipartFile> anexosFactura) {
      this.anexosFactura = anexosFactura;
   }

   @EmbeddedId
   public PedidoPK getLlave() {
      return llave;
   }

   public void setLlave(PedidoPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "PEOT_FECHA")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFecha() {
      return fecha;
   }

   public void setFecha(Date fecha) {
      this.fecha = fecha;
   }

   @Basic(optional = false)
   @Column(name = "PEOT_DESCUENTO")
   public double getDescuento() {
      return descuento;
   }

   public void setDescuento(double descuento) {
      this.descuento = descuento;
   }

   @Basic(optional = false)
   @Column(name = "PEOT_RETENCION_IVA")
   public double getRetencionIva() {
      return retencionIva;
   }

   public void setRetencionIva(double retencionIva) {
      this.retencionIva = retencionIva;
   }

   @Size(max = 250, message = "La longitud máxima de comentarios es 250 caracteres.")
   @Column(name = "PEOT_COMENTARIOS")
   public String getComentarios() {
      return comentarios;
   }

   public void setComentarios(String comentarios) {
      this.comentarios = comentarios;
   }

   @Basic(optional = false)
   @Column(name = "PEOT_ESTATUS")
   public String getEstatus() {
      return estatus;
   }

   public void setEstatus(String estatus) {
      this.estatus = estatus;
   }

   @Basic(optional = false)
   @Column(name = "PEOT_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "PEOT_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @Valid
   @NotNull(message = "Especificar el Proveedor del Pedido")
   @JoinColumn(name = "PEOT_PROV_NUMERO", referencedColumnName = "PROV_NUMERO")
   @ManyToOne
   public Proveedor getProveedor() {
      return proveedor;
   }

   public void setProveedor(Proveedor proveedor) {
      this.proveedor = proveedor;
   }

   @JoinColumns({
      @JoinColumn(name = "PEOT_FLUJ_CLAVE", referencedColumnName = "HIFL_FLUJ_CLAVE"),
      @JoinColumn(name = "PEOT_HIFL_NUMERO", referencedColumnName = "HIFL_NUMERO")})
   @OneToOne
   public Solicitud getSolicitud() {
      return solicitud;
   }

   public void setSolicitud(Solicitud solicitud) {
      this.solicitud = solicitud;
   }

   @Valid
   @Size(min = 1)
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
   public List<PedidoOrden> getOrdenes() {
      return ordenes;
   }

   public void setOrdenes(List<PedidoOrden> ordenes) {
      this.ordenes = ordenes;
   }

   @Valid
   @Size(min = 1, message = "Debe especificar al menos una factura.")
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
   public List<Factura> getFacturas() {
      return facturas;
   }

   public void setFacturas(List<Factura> facturas) {
      this.facturas = facturas;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Pedido)) {
         return false;
      }
      Pedido other = (Pedido) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Pedido[ llave=" + llave + " ]";
   }
}
